﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Security.Cryptography;

namespace SampleWinProject
{
    public partial class frmCrypto : Form
    {
        private string Key,IV;
        System.Security.Cryptography.SymmetricAlgorithm manager = new RijndaelManaged();

        public frmCrypto()
        {
            InitializeComponent();
        }


        /// <summary>
        /// 加密字符串
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnEncrypt_Click(object sender, EventArgs e)
        {
            Rijndael r = Rijndael.Create();
            r.GenerateKey();
            //r.Key;
            //System.Security.Cryptography.RijndaelManaged manager = new RijndaelManaged();
            Key = "Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH";
            IV = "567890";

            richTextBox1.Text =  Encrypto(txtFrom.Text);
            //ICryptoTransform transfrom = manager.CreateEncryptor(System.Text.UTF8Encoding.UTF8.GetBytes(Key),
            //    System.Text.UTF8Encoding.UTF8.GetBytes(IV));
            txtTo.Text = this.Decrypto(richTextBox1.Text);
            
        }

        /// <summary>
        /// 获得密钥
        /// </summary>
        /// <returns>密钥</returns>
        private byte[] GetLegalKey()
        {
            string sTemp = Key;
            manager.GenerateKey();
            byte[] bytTemp = manager.Key;
            int KeyLength = bytTemp.Length;
            if (sTemp.Length > KeyLength)
                sTemp = sTemp.Substring(0, KeyLength);
            else if (sTemp.Length < KeyLength)
                sTemp = sTemp.PadRight(KeyLength, ' ');
            return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }
        /// <summary>
        /// 获得初始向量IV
        /// </summary>
        /// <returns>初试向量IV</returns>
        private byte[] GetLegalIV()
        {
            string sTemp = "E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk";
            manager.GenerateIV();
            byte[] bytTemp = manager.IV;
            int IVLength = bytTemp.Length;
            if (sTemp.Length > IVLength)
                sTemp = sTemp.Substring(0, IVLength);
            else if (sTemp.Length < IVLength)
                sTemp = sTemp.PadRight(IVLength, ' ');
            return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }


        public string Encrypto(string Source)
        {
            byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
           

            manager.Key = GetLegalKey();
            manager.IV = GetLegalIV();
            ICryptoTransform encrypto = manager.CreateEncryptor();
            CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
            cs.Write(bytIn, 0, bytIn.Length);
            cs.FlushFinalBlock();
            ms.Close();
            byte[] bytOut = ms.ToArray();
            return Convert.ToBase64String(bytOut);
        }


        /// <summary>
        /// 解密方法
        /// </summary>
        /// <param name="Source">待解密的串</param>
        /// <returns>经过解密的串</returns>
        public string Decrypto(string Source)
        {
            byte[] bytIn = Convert.FromBase64String(Source);
            System.IO.MemoryStream ms = new System.IO.MemoryStream(bytIn, 0, bytIn.Length);
            manager.Key = GetLegalKey();
            manager.IV = GetLegalIV();
            ICryptoTransform encrypto = manager.CreateDecryptor();
            CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
            System.IO.StreamReader sr = new System.IO.StreamReader(cs);
            return sr.ReadToEnd();
        }
    }
}